css: Support colors in cross fades
authorMatthias Clasen <mclasen@redhat.com>
Wed, 27 Jan 2021 02:10:47 +0000 (21:10 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 27 Jan 2021 02:14:09 +0000 (21:14 -0500)
The CSS Image Spec (Level 4) allows colors in
cross-fade expressions to specify solid-color images.

Support this.

docs/reference/gtk/css-properties.md
gtk/gtkcssimagecrossfade.c

index 6fde7d45181d58e3a06bb92a5d7f9f1af6f53b1c..8fa9819fc7e56ba4320ebeedd5a3ff64a2d74b9b 100644 (file)
@@ -218,7 +218,7 @@ done with
 |background-size| [CSS Backgrounds and Borders Level 3](https://www.w3.org/TR/css3-background/#background-size) | |
 |background-position| [CSS Backgrounds and Borders Level 3](https://www.w3.org/TR/css3-background/#background-position) | |
 |background-repeat| [CSS Backgrounds and Borders Level 3](https://www.w3.org/TR/css3-background/#background-repeat) | |
-|background-image| [CSS Backgrounds and Borders Level 3](https://www.w3.org/TR/css3-background/#background-image) | not supported: urls without quotes, colors in crossfades |
+|background-image| [CSS Backgrounds and Borders Level 3](https://www.w3.org/TR/css3-background/#background-image) | not supported: urls without quotes |
 |box-shadow| [CSS Backgrounds and Borders Level 3](https://www.w3.org/TR/css3-background/#box-shadow) | |
 |background-blend-mode| [CSS Compositing and Blending Level 1](https://www.w3.org/TR/compositing-1/#propdef-background-blend-mode) | only affects multiple backgrounds |
 |background| [CSS Backgrounds and Borders Level 3](https://www.w3.org/TR/css3-background/#background) | |
index 4ec2c3f0f158e2dced4f7f4309e93e3c8a5cf483..fadd11331d1eff7a21f4a8067ade67ab5bee4c13 100644 (file)
@@ -25,6 +25,9 @@
 #include "gtkcssimagecrossfadeprivate.h"
 
 #include "gtkcssnumbervalueprivate.h"
+#include "gtkcssimagefallbackprivate.h"
+#include "gtkcsscolorvalueprivate.h"
+
 
 typedef struct _CrossFadeEntry CrossFadeEntry;
 
@@ -308,8 +311,19 @@ parse_image (GtkCssParser *parser,
 {
   GtkCssImage **image = option_data;
 
-  *image = _gtk_css_image_new_parse (parser);
-  if (*image == NULL)
+  if (_gtk_css_image_can_parse (parser))
+    *image = _gtk_css_image_new_parse (parser);
+  else if (gtk_css_color_value_can_parse (parser))
+    {
+      GtkCssValue *color;
+
+      color = _gtk_css_color_value_parse (parser);
+      if (color == NULL)
+        return FALSE;
+
+      *image = _gtk_css_image_fallback_new_for_color (color);
+    }
+  else
     return FALSE;
 
   return TRUE;
@@ -325,7 +339,7 @@ gtk_css_image_cross_fade_parse_arg (GtkCssParser *parser,
   GtkCssImage *image = NULL;
   GtkCssParseOption options[] =
     {
-      { (void *) gtk_css_number_value_can_parse, parse_progress, &progress },
+      { (void *)gtk_css_number_value_can_parse, parse_progress, &progress },
       { NULL, parse_image, &image },
     };